"""
标准音频文件解析器
解析音频文件名并提取汉字、拼音、声调信息
"""
import re
import os
from typing import Dict, List, Tuple, Optional

class AudioParser:
    def __init__(self):
        # 声调映射
        self.tone_map = {
            '1': '一声', '2': '二声', '3': '三声', '4': '四声'
        }
        
        # 从您的对照表构建的映射字典
        self.standard_mapping = {
            # 基于您提供的对照表
            'a1': ('阿', 'ā', 1),
            'ai1': ('挨', 'āi', 1), 
            'ai2': ('挨', 'ái', 2),
            'ai3': ('矮', 'ǎi', 3),
            'ai4': ('爱', 'ài', 4),
            'an1': ('安', 'ān', 1),
            'an4': ('岸', 'àn', 4),
            'ao1': ('凹', 'āo', 1),
            'ao2': ('敖', 'áo', 2),
            # 可以继续添加更多映射...
        }
    
    def parse_filename(self, filename: str) -> Optional[Dict]:
        """
        解析标准音频文件名
        格式: 1_编号_1_拼音声调_0_拼音声调.wav
        
        Args:
            filename: 音频文件名
            
        Returns:
            包含解析信息的字典，如果解析失败返回None
        """
        # 移除文件扩展名
        name_without_ext = os.path.splitext(filename)[0]
        
        # 使用正则表达式解析
        pattern = r'1_(\d+)_1_([a-z]+\d)_0_([a-z]+\d)'
        match = re.match(pattern, name_without_ext)
        
        if not match:
            return None
            
        file_id, pinyin_tone1, pinyin_tone2 = match.groups()
        
        # 验证两个拼音声调部分是否一致
        if pinyin_tone1 != pinyin_tone2:
            return None
            
        # 提取拼音和声调
        pinyin_match = re.match(r'([a-z]+)(\d)', pinyin_tone1)
        if not pinyin_match:
            return None
            
        pinyin_base, tone_str = pinyin_match.groups()
        tone = int(tone_str)
        
        # 从映射表获取汉字信息
        if pinyin_tone1 in self.standard_mapping:
            character, pinyin_marked, mapped_tone = self.standard_mapping[pinyin_tone1]
        else:
            # 如果映射表中没有，使用默认值
            character = f"[{pinyin_base}]"
            pinyin_marked = pinyin_base
            mapped_tone = tone
        
        return {
            'filename': filename,
            'file_id': file_id,
            'character': character,
            'pinyin_base': pinyin_base,
            'pinyin_marked': pinyin_marked,
            'tone': tone,
            'tone_name': self.tone_map.get(str(tone), f"{tone}声"),
            'pinyin_tone_code': pinyin_tone1
        }
    
    def get_standard_audio_list(self, directory: str) -> List[Dict]:
        """
        扫描目录获取所有标准音频文件信息
        
        Args:
            directory: 标准音频文件目录
            
        Returns:
            包含所有音频文件信息的列表
        """
        audio_files = []
        
        if not os.path.exists(directory):
            return audio_files
            
        for filename in os.listdir(directory):
            if filename.endswith('.wav'):
                parsed = self.parse_filename(filename)
                if parsed:
                    parsed['full_path'] = os.path.join(directory, filename)
                    audio_files.append(parsed)
        
        # 按编号排序
        audio_files.sort(key=lambda x: int(x['file_id']))
        return audio_files
    
    def group_by_tone(self, audio_list: List[Dict]) -> Dict[int, List[Dict]]:
        """
        按声调分组标准音频
        
        Args:
            audio_list: 音频文件信息列表
            
        Returns:
            按声调分组的字典
        """
        grouped = {1: [], 2: [], 3: [], 4: []}
        
        for audio in audio_list:
            tone = audio['tone']
            if tone in grouped:
                grouped[tone].append(audio)
                
        return grouped
    
    def search_by_character(self, audio_list: List[Dict], character: str) -> List[Dict]:
        """
        按汉字搜索标准音频
        
        Args:
            audio_list: 音频文件信息列表
            character: 要搜索的汉字
            
        Returns:
            匹配的音频文件列表
        """
        return [audio for audio in audio_list if audio['character'] == character]
    
    def search_by_pinyin(self, audio_list: List[Dict], pinyin: str) -> List[Dict]:
        """
        按拼音搜索标准音频
        
        Args:
            audio_list: 音频文件信息列表
            pinyin: 要搜索的拼音
            
        Returns:
            匹配的音频文件列表
        """
        return [audio for audio in audio_list if audio['pinyin_base'] == pinyin.lower()]

# 使用示例
if __name__ == "__main__":
    parser = AudioParser()
    
    # 测试文件名解析
    test_files = [
        "1_0001_1_a1_0_a1.wav",
        "1_0004_1_ai2_0_ai2.wav", 
        "1_0005_1_ai3_0_ai3.wav",
        "1_0006_1_ai4_0_ai4.wav"
    ]
    
    for filename in test_files:
        result = parser.parse_filename(filename)
        if result:
            print(f"{filename} -> {result['character']}({result['pinyin_marked']}) {result['tone_name']}")
        else:
            print(f"{filename} -> 解析失败")
